/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence;

import java.io.Serializable;

import javax.annotation.Resource;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.apache.log4j.Logger;
import org.osiris.persistence.controllers.RelacionRequisitoInterface;
import org.osiris.persistence.controllers.exceptions.IllegalOrphanException;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;
import org.osiris.server.utils.AppContext;
import org.springframework.context.ApplicationContext;

/**
 *
 * @author amartinez
 */
@Entity
@Table(name = "Relacionrequisito")
@NamedQueries({@NamedQuery(name = "Relacionrequisito.findAll", query = "SELECT r FROM Relacionrequisito r"), @NamedQuery(name = "Relacionrequisito.findByRequisitodestino", query = "SELECT r FROM Relacionrequisito r WHERE r.relacionrequisitoPK.requisitodestino = :requisitodestino"), @NamedQuery(name = "Relacionrequisito.findByRequisitoorigen", query = "SELECT r FROM Relacionrequisito r WHERE r.relacionrequisitoPK.requisitoorigen = :requisitoorigen"), @NamedQuery(name = "Relacionrequisito.findByIdTiposDeRelacion", query = "SELECT r FROM Relacionrequisito r WHERE r.relacionrequisitoPK.idTiposDeRelacion = :idTiposDeRelacion")})
public class Relacionrequisito implements Serializable {

	@Transient
	@Resource
	RelacionRequisitoInterface dependenciasDAO;
	@Transient
	Logger logger = Logger.getLogger(this.getClass());
	@Transient
	private ApplicationContext ctx = AppContext.getApplicationContext();

	private static final long serialVersionUID = 1L;

	@EmbeddedId
	protected RelacionrequisitoPK relacionrequisitoPK;
	@JoinColumn(name = "Requisito_destino", referencedColumnName = "idRequisito", insertable = false, updatable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private Requisito requisito;
	@JoinColumn(name = "Requisito_origen", referencedColumnName = "idRequisito", insertable = false, updatable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private Requisito requisito1;
	@JoinColumn(name = "idTiposDeRelacion", referencedColumnName = "idTiposDeRelacion", insertable = false, updatable = false)
	@ManyToOne(optional = false, fetch = FetchType.LAZY)
	private Tiposderelacion tiposderelacion;
	public Relacionrequisito() {
	}
	public Relacionrequisito(long requisitodestino, long requisitoorigen, long idTiposDeRelacion) {
		this.relacionrequisitoPK = new RelacionrequisitoPK(requisitodestino, requisitoorigen, idTiposDeRelacion);
	}

	public Relacionrequisito(RelacionrequisitoPK relacionrequisitoPK) {
		this.relacionrequisitoPK = relacionrequisitoPK;
	}

	public void crear() {
		logger.info("Guardando relacion requisito en BD...");
		try {
			dependenciasDAO= (RelacionRequisitoInterface) ctx.getBean("RequisitoJpaController"); 
			dependenciasDAO.create(this);
			logger.info("Guardado OK en db");
		} catch (Exception e) {
			logger.info("Error guardando la relacion del requisito:" + e.toString());
			e.printStackTrace();
		}
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are not set
		if (!(object instanceof Relacionrequisito)) {
			return false;
		}
		Relacionrequisito other = (Relacionrequisito) object;
		if ((this.relacionrequisitoPK == null && other.relacionrequisitoPK != null) || (this.relacionrequisitoPK != null && !this.relacionrequisitoPK.equals(other.relacionrequisitoPK))) {
			return false;
		}
		return true;
	}

	public RelacionrequisitoPK getRelacionrequisitoPK() {
		return relacionrequisitoPK;
	}

	public Requisito getRequisito() {
		return requisito;
	}

	public Requisito getRequisito1() {
		return requisito1;
	}

	public Tiposderelacion getTiposderelacion() {
		return tiposderelacion;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (relacionrequisitoPK != null ? relacionrequisitoPK.hashCode() : 0);
		return hash;
	}

	/**
	 * Modifica el requisito en db
	 * 
	 */
	 public void modificar() {
		 logger.info("Modificando requisito en BD");
		 try {
			 dependenciasDAO.edit(this);
			 logger.info("Modificacion OK en db");
		 } catch (IllegalOrphanException e) {
			 e.printStackTrace();
		 } catch (NonexistentEntityException e) {
			 logger.info("Error modificando la relacion del requisito:" + e.toString());
			 e.printStackTrace();
		 } catch (Exception e) {
			 e.printStackTrace();
		 }
	 }

	 public void setRelacionrequisitoPK(RelacionrequisitoPK relacionrequisitoPK) {
		 this.relacionrequisitoPK = relacionrequisitoPK;
	 }

	 public void setRequisito(Requisito requisito) {
		 this.requisito = requisito;
	 }

	 public void setRequisito1(Requisito requisito1) {
		 this.requisito1 = requisito1;
	 }

	 public void setTiposderelacion(Tiposderelacion tiposderelacion) {
		 this.tiposderelacion = tiposderelacion;
	 }

	 @Override
	 public String toString() {
		 return "org.osiris.persistence.Relacionrequisito[relacionrequisitoPK=" + relacionrequisitoPK + "]";
	 }

}
